package cn.com.w.redisson.config;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.redisson.config.TransportMode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * redisson配置
 *
 * @author zhangxiaolong
 * @date 2022/12/29 11:14
 * @description
 * @menu tool-temp
 **/
@Configuration
public class RedissonConfig {

    @Autowired
    private RedisProperties redisProperties;

    @Bean("redissonClient")
    public RedissonClient redissonClient() {
        Config config = new Config();
        String redisUrl = String.format("redis://%s:%s", redisProperties.getHost() + "", redisProperties.getPort() + "");
        config.useSingleServer().setAddress(redisUrl).setPassword(redisProperties.getPassword());
        config.setCodec(new JsonJacksonCodec());

        /**
         * threads（线程池数量）
         * 默认值: 当前处理核数量 * 2
         */
        config.setThreads(2);
        /**
         * 可选参数：
         * TransportMode.NIO - 默认值
         * TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包（Linux）
         * TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包（macOS）
         */
        config.setTransportMode(TransportMode.NIO);

        /**
         * lockWatchdogTimeout（监控锁的看门狗超时，单位：毫秒）
         *
         * 默认值：30000
         *
         * 监控锁的看门狗超时时间单位为毫秒。该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况。
         * 如果该看门口未使用lockWatchdogTimeout去重新调整一个分布式锁的lockWatchdogTimeout超时，那么这个锁将变为失效状态。
         * 这个参数可以用来避免由Redisson客户端节点宕机或其他原因造成死锁的情况。
         */
        config.setLockWatchdogTimeout(30000);
        return Redisson.create(config);
    }

}
